package com.lanlian.cayman.utils;

import com.lanlian.commonlib.bean.ReqAbout;
import com.lanlian.commonlib.bean.ReqAddBank;
import com.lanlian.commonlib.bean.ReqBankList;
import com.lanlian.commonlib.bean.ReqBanner;
import com.lanlian.commonlib.bean.ReqConfirmMobile;
import com.lanlian.commonlib.bean.ReqDealDetails;
import com.lanlian.commonlib.bean.ReqDeleteBank;
import com.lanlian.commonlib.bean.ReqDeleteProfitLoss;
import com.lanlian.commonlib.bean.ReqDocumentaryList;
import com.lanlian.commonlib.bean.ReqEmailCode;
import com.lanlian.commonlib.bean.ReqEntrustDetails;
import com.lanlian.commonlib.bean.ReqFundDetails;
import com.lanlian.commonlib.bean.ReqGetPreRegister;
import com.lanlian.commonlib.bean.ReqLazyEnum;
import com.lanlian.commonlib.bean.ReqLoginOut;
import com.lanlian.commonlib.bean.ReqMessage;
import com.lanlian.commonlib.bean.ReqModifyEmail;
import com.lanlian.commonlib.bean.ReqModifyMobile;
import com.lanlian.commonlib.bean.ReqPnlDetails;
import com.lanlian.commonlib.bean.ReqPositionDetails;
import com.lanlian.commonlib.bean.ReqPreRegister;
import com.lanlian.commonlib.bean.ReqProfitLossList;
import com.lanlian.commonlib.bean.ReqQueryRecharge;
import com.lanlian.commonlib.bean.ReqQueryUpload;
import com.lanlian.commonlib.bean.ReqQuestionList;
import com.lanlian.commonlib.bean.ReqRecharge;
import com.lanlian.commonlib.bean.ReqRegisterEnum;
import com.lanlian.commonlib.bean.ReqRegisterResult;
import com.lanlian.commonlib.bean.ReqSendSmsCode;
import com.lanlian.commonlib.bean.ReqSetProfitLoss;
import com.lanlian.commonlib.bean.ReqSmsCode;
import com.lanlian.commonlib.bean.ReqSmsCodeForUpdateMobile;
import com.lanlian.commonlib.bean.ReqSmsCodePreRegister;
import com.lanlian.commonlib.bean.ReqStartEnum;
import com.lanlian.commonlib.bean.ReqSubmitPreRegister;
import com.lanlian.commonlib.bean.ReqTradeEntrust;
import com.lanlian.commonlib.bean.ReqUnitAsset;
import com.lanlian.commonlib.bean.ReqUpdatePassword;
import com.lanlian.commonlib.bean.ReqUpdateProfitLoss;
import com.lanlian.commonlib.bean.ReqUpdateUserRegister;
import com.lanlian.commonlib.bean.ReqUpdateVersion;
import com.lanlian.commonlib.bean.ReqUpload;
import com.lanlian.commonlib.bean.ReqUserInfo;
import com.lanlian.commonlib.bean.ReqUserLogin;
import com.lanlian.commonlib.bean.ReqUserRegister;
import com.lanlian.commonlib.bean.ReqVerifyBank;
import com.lanlian.commonlib.bean.ReqVerifyID;
import com.lanlian.commonlib.bean.ReqVerifyInviteCode;
import com.lanlian.commonlib.bean.ReqVerifySmsCode;
import com.lanlian.commonlib.bean.ReqWithdraw;
import com.lanlian.commonlib.network.INetWorkCallback;
import com.lanlian.commonlib.network.NetWorkImpl;
import com.lanlian.commonlib.network.QCHttpRequestProxy;

/**
 * <pre>
 *     author : huxiaobo
 *     e-mail : huxiaobo@xlanlian.com
 *     date   : 2018/8/24 16:50
 *     desc   : VolleyHttp请求工具
 *     version: 1.0
 * </pre>
 */
public class VolleyRequestUtils {

    private static VolleyRequestUtils singleton;

    public static VolleyRequestUtils getInstance() {
        if (singleton == null) {
            synchronized (VolleyRequestUtils.class) {
                if (singleton == null) {
                    singleton = new VolleyRequestUtils();
                }
            }
        }
        return singleton;
    }

    /**
     * 获取基础信息（启动时加载）
     *
     * @param reqStartEnum 基础信息请求对象
     * @param callback     请求回调
     */
    public void getStartEnum(String tag, boolean cache, boolean getCache, ReqStartEnum reqStartEnum, INetWorkCallback callback) {
        sendRequest(tag, cache, getCache, reqStartEnum, callback);
    }

    /**
     * 获取基础信息（用到时加载）
     *
     * @param reqLazyEnum 基础信息请求对象
     * @param callback    请求回调
     */
    public void getLazyEnum(String tag, boolean cache, boolean getCache, ReqLazyEnum reqLazyEnum, INetWorkCallback callback) {
        sendRequest(tag, cache, getCache, reqLazyEnum, callback);
    }

    /**
     * 用户登录
     *
     * @param reqUserLogin 用户登录请求对象
     * @param callback     请求回调
     */
    public void userLogin(String tag, ReqUserLogin reqUserLogin, INetWorkCallback callback) {
        sendRequest(tag, reqUserLogin, callback);
    }

    /**
     * 用户注册
     *
     * @param reqUserRegister 用户注册请求对象
     * @param callback        请求回调
     */
    public void userRegister(String tag, ReqUserRegister reqUserRegister, INetWorkCallback callback) {
        sendRequest(tag, reqUserRegister, callback);
    }

    /**
     * 账户资料补充申请
     *
     * @param reqUpdateUserRegister 账户资料补充申请请求对象
     * @param callback              请求回调
     */
    public void updateUserRegister(String tag, ReqUpdateUserRegister reqUpdateUserRegister, INetWorkCallback callback) {
        sendRequest(tag, reqUpdateUserRegister, callback);
    }

    /**
     * 获取委托记录
     *
     * @param reqEntrustDetails 委托记录请求对象
     * @param callback          请求回调
     */
    public void getEntrustDetails(String tag, ReqEntrustDetails reqEntrustDetails, INetWorkCallback callback) {
        sendRequest(tag, reqEntrustDetails, callback);
    }

    /**
     * 获取交易委托列表
     *
     * @param reqTradeEntrust 委托记录请求对象
     * @param callback        请求回调
     */
    public void getTradeEntrust(String tag, ReqTradeEntrust reqTradeEntrust, INetWorkCallback callback) {
        sendRequest(tag, reqTradeEntrust, callback);
    }

    /**
     * 获取跟单列表
     *
     * @param reqDocumentaryList 跟单列表请求对象
     * @param callback           请求回调
     */
    public void getDocumentaryList(String tag, ReqDocumentaryList reqDocumentaryList, INetWorkCallback callback) {
        sendRequest(tag, reqDocumentaryList, callback);
    }

    /**
     * 获取成交记录
     *
     * @param reqDealDetails 成交记录请求对象
     * @param callback       请求回调
     */
    public void getDealDetails(String tag, ReqDealDetails reqDealDetails, INetWorkCallback callback) {
        sendRequest(tag, reqDealDetails, callback);
    }

    /**
     * 获取资金流水
     *
     * @param reqFundDetails 资金流水请求对象
     * @param callback       请求回调
     */
    public void getFundDetails(String tag, ReqFundDetails reqFundDetails, INetWorkCallback callback) {
        sendRequest(tag, reqFundDetails, callback);
    }

    /**
     * 持仓列表
     *
     * @param reqPositionDetails 持仓列表请求对象
     * @param callback           请求回调
     */
    public void getPositionDetails(String tag, ReqPositionDetails reqPositionDetails, INetWorkCallback callback) {
        sendRequest(tag, reqPositionDetails, callback);
    }

    /**
     * 获取消息列表
     *
     * @param reqMessage 消息列表请求对象
     * @param callback   请求回调
     */
    public void getMessageList(String tag, ReqMessage reqMessage, INetWorkCallback callback) {
        sendRequest(tag, reqMessage, callback);
    }

    /**
     * 新增银行卡信息
     *
     * @param reqAddBank 新增银行卡请求对象
     * @param callback   请求回调
     */
    public void addBank(String tag, ReqAddBank reqAddBank, INetWorkCallback callback) {
        sendRequest(tag, reqAddBank, callback);
    }

    /**
     * 解绑银行卡信息
     *
     * @param reqDeleteBank 解绑银行卡请求对象
     * @param callback      请求回调
     */
    public void deleteBank(String tag, ReqDeleteBank reqDeleteBank, INetWorkCallback callback) {
        sendRequest(tag, reqDeleteBank, callback);
    }


    /**
     * 修改密码信息
     *
     * @param reqUpdatePassword 修改密码请求对象
     * @param callback          请求回调
     */
    public void updatePassword(String tag, ReqUpdatePassword reqUpdatePassword, INetWorkCallback callback) {
        sendRequest(tag, reqUpdatePassword, callback);
    }

    /**
     * 退出登录
     *
     * @param reqLoginOut 退出登录请求对象
     * @param callback    请求回调
     */
    public void loginOut(String tag, ReqLoginOut reqLoginOut, INetWorkCallback callback) {
        sendRequest(tag, reqLoginOut, callback);
    }

    /**
     * 发送验证码
     *
     * @param reqSmsCode 发送验证码请求对象
     * @param callback   请求回调
     */
    public void sendSmsCode(String tag, ReqSmsCodeForUpdateMobile reqSmsCode, INetWorkCallback callback) {
        sendRequest(tag, reqSmsCode, callback);
    }

    /**
     * 发送验证码
     *
     * @param reqSmsCode 发送验证码请求对象
     * @param callback   请求回调
     */
    public void sendSmsCode(String tag, ReqSmsCode reqSmsCode, INetWorkCallback callback) {
        sendRequest(tag, reqSmsCode, callback);
    }

    /**
     * 通用发送验证码
     *
     * @param reqSendSmsCode 通用发送验证码请求对象
     * @param callback       请求回调
     */
    public void sendSmsCode(String tag, ReqSendSmsCode reqSendSmsCode, INetWorkCallback callback) {
        sendRequest(tag, reqSendSmsCode, callback);
    }

    /**
     * 验证验证码
     *
     * @param reqVerifySmsCode 验证验证码请求对象
     * @param callback         请求回调
     */
    public void verifySmsCode(String tag, ReqVerifySmsCode reqVerifySmsCode, INetWorkCallback callback) {
        sendRequest(tag, reqVerifySmsCode, callback);
    }

    /**
     * 确认手机号码
     *
     * @param reqConfirmMobile 确认手机号码请求对象
     * @param callback         请求回调
     */
    public void confirmMobile(String tag, ReqConfirmMobile reqConfirmMobile, INetWorkCallback callback) {
        sendRequest(tag, reqConfirmMobile, callback);
    }

    /**
     * 修改手机号码
     *
     * @param reqModifyMobile 修改手机号码请求对象
     * @param callback        请求回调
     */
    public void modifyMobile(String tag, ReqModifyMobile reqModifyMobile, INetWorkCallback callback) {
        sendRequest(tag, reqModifyMobile, callback);
    }

    /**
     * 邮箱验证码
     *
     * @param reqEmailCode 邮箱验证码请求对象
     * @param callback     请求回调
     */
    public void sendEmailCode(String tag, ReqEmailCode reqEmailCode, INetWorkCallback callback) {
        sendRequest(tag, reqEmailCode, callback);
    }

    /**
     * 修改邮箱
     *
     * @param reqModifyEmail 修改邮箱请求对象
     * @param callback       请求回调
     */
    public void modifyEmail(String tag, ReqModifyEmail reqModifyEmail, INetWorkCallback callback) {
        sendRequest(tag, reqModifyEmail, callback);
    }

    /**
     * 获取用户信息
     *
     * @param reqUserInfo 获取用户信息请求对象
     * @param callback    请求回调
     */
    public void getUserInfo(String tag, ReqUserInfo reqUserInfo, INetWorkCallback callback) {
        sendRequest(tag, reqUserInfo, callback);
    }

    /**
     * 获取止盈止损列表
     *
     * @param reqProfitLossList 获取止盈止损列表请求对象
     * @param callback          请求回调
     */
    public void getProfitLossList(String tag, ReqProfitLossList reqProfitLossList, INetWorkCallback callback) {
        sendRequest(tag, reqProfitLossList, callback);
    }

    /**
     * 更新止盈止损
     *
     * @param reqUpdateProfitLoss 更新止盈止损请求对象
     * @param callback            请求回调
     */
    public void updateProfitLoss(String tag, ReqUpdateProfitLoss reqUpdateProfitLoss, INetWorkCallback callback) {
        sendRequest(tag, reqUpdateProfitLoss, callback);
    }

    /**
     * 新增止盈止损
     *
     * @param reqSetProfitLoss 新增止盈止损请求对象
     * @param callback         请求回调
     */
    public void setProfitLoss(String tag, ReqSetProfitLoss reqSetProfitLoss, INetWorkCallback callback) {
        sendRequest(tag, reqSetProfitLoss, callback);
    }

    /**
     * 删除止盈止损
     *
     * @param reqDeleteProfitLoss 删除止盈止损请求对象
     * @param callback            请求回调
     */
    public void deleteProfitLoss(String tag, ReqDeleteProfitLoss reqDeleteProfitLoss, INetWorkCallback callback) {
        sendRequest(tag, reqDeleteProfitLoss, callback);
    }

    /**
     * 客户资产
     *
     * @param reqUnitAsset 客户资产请求对象
     * @param callback     请求回调
     */
    public void getUnitAsset(String tag, ReqUnitAsset reqUnitAsset, INetWorkCallback callback) {
        sendRequest(tag, reqUnitAsset, callback);
    }

    /**
     * 提现
     *
     * @param reqWithdraw 提现请求对象
     * @param callback    请求回调
     */
    public void withdraw(String tag, ReqWithdraw reqWithdraw, INetWorkCallback callback) {
        sendRequest(tag, reqWithdraw, callback);
    }

    /**
     * 盈亏明细
     *
     * @param reqPnlDetails 盈亏明细请求对象
     * @param callback      请求回调
     */
    public void getPnlDetails(String tag, ReqPnlDetails reqPnlDetails, INetWorkCallback callback) {
        sendRequest(tag, reqPnlDetails, callback);
    }

    /**
     * 预注册发送验证码
     *
     * @param reqSmsCodePreRegister 预注册发送验证码请求对象
     * @param callback              请求回调
     */
    public void getSmsCodePreRegister(String tag, ReqSmsCodePreRegister reqSmsCodePreRegister, INetWorkCallback callback) {
        sendRequest(tag, reqSmsCodePreRegister, callback);
    }

    /**
     * 预注册
     *
     * @param reqPreRegister 预注册请求对象
     * @param callback       请求回调
     */
    public void preRegister(String tag, ReqPreRegister reqPreRegister, INetWorkCallback callback) {
        sendRequest(tag, reqPreRegister, callback);
    }

    /**
     * 发送预注册
     *
     * @param reqSubmitPreRegister 发送预注册请求对象
     * @param callback             请求回调
     */
    public void submitPreRegister(String tag, ReqSubmitPreRegister reqSubmitPreRegister, INetWorkCallback callback) {
        sendRequest(tag, reqSubmitPreRegister, callback);
    }

    /**
     * 获取预注册
     *
     * @param reqGetPreRegister 获取预注册请求对象
     * @param callback          请求回调
     */
    public void getPreRegister(String tag, ReqGetPreRegister reqGetPreRegister, INetWorkCallback callback) {
        sendRequest(tag, reqGetPreRegister, callback);
    }

    /**
     * 关于我们
     *
     * @param reqAbout 关于我们请求对象
     * @param callback 请求回调
     */
    public void about(String tag, ReqAbout reqAbout, INetWorkCallback callback) {
        sendRequest(tag, reqAbout, callback);
    }

    /**
     * Banner
     *
     * @param reqBanner Banner请求对象
     * @param callback  请求回调
     */
    public void getBanner(String tag, ReqBanner reqBanner, INetWorkCallback callback) {
        sendRequest(tag, reqBanner, callback);
    }

    /**
     * 常见问题
     *
     * @param reqQuestionList 常见问题请求对象
     * @param callback        请求回调
     */
    public void getQuestionList(String tag, ReqQuestionList reqQuestionList, INetWorkCallback callback) {
        sendRequest(tag, reqQuestionList, callback);
    }

    /**
     * 充值
     *
     * @param reqRecharge 充值请求对象
     * @param callback    请求回调
     */
    public void recharge(String tag, ReqRecharge reqRecharge, INetWorkCallback callback) {
        sendRequest(tag, reqRecharge, callback);
    }

    /**
     * 开户枚举
     *
     * @param reqRegisterEnum 开户枚举请求对象
     * @param callback        请求回调
     */
    public void getRegisterEnum(String tag, ReqRegisterEnum reqRegisterEnum, INetWorkCallback callback) {
        sendRequest(tag, reqRegisterEnum, callback);
    }

    /**
     * 银行卡列表
     *
     * @param reqBankList 银行卡列表请求对象
     * @param callback    请求回调
     */
    public void getBankList(String tag, ReqBankList reqBankList, INetWorkCallback callback) {
        sendRequest(tag, reqBankList, callback);
    }

    /**
     * 开户结果查询
     *
     * @param reqRegisterResult 开户结果查询请求对象
     * @param callback          请求回调
     */
    public void getRegisterResult(String tag, ReqRegisterResult reqRegisterResult, INetWorkCallback callback) {
        sendRequest(tag, reqRegisterResult, callback);
    }

    /**
     * 上传文件
     *
     * @param reqUpload 上传文件请求对象
     * @param callback  请求回调
     */
    public void uploadFile(String tag, ReqUpload reqUpload, INetWorkCallback callback) {
        sendRequest(tag, reqUpload, callback);
    }

    /**
     * 查询上传文件
     *
     * @param reqQueryUpload 查询上传文件请求对象
     * @param callback       请求回调
     */
    public void queryUploadFile(String tag, ReqQueryUpload reqQueryUpload, INetWorkCallback callback) {
        sendRequest(tag, reqQueryUpload, callback);
    }

    /**
     * 检查更新
     *
     * @param reqUpdateVersion 检查更新请求对象
     * @param callback         请求回调
     */
    public void updateVersion(String tag, ReqUpdateVersion reqUpdateVersion, INetWorkCallback callback) {
        sendRequest(tag, reqUpdateVersion, callback);
    }

    /**
     * 校验银行卡
     *
     * @param reqVerifyBank 校验银行卡请求对象
     * @param callback      请求回调
     */
    public void verifyBankCard(String tag, ReqVerifyBank reqVerifyBank, INetWorkCallback callback) {
        sendRequest(tag, reqVerifyBank, callback);
    }

    /**
     * 校验身份证
     *
     * @param reqVerifyID 校验身份证请求对象
     * @param callback    请求回调
     */
    public void verifyIdCard(String tag, ReqVerifyID reqVerifyID, INetWorkCallback callback) {
        sendRequest(tag, reqVerifyID, callback);
    }

    /**
     * 充值购物券列表
     *
     * @param reqQueryRecharge 充值购物券列表请求对象
     * @param callback         请求回调
     */
    public void queryRecharge(String tag, ReqQueryRecharge reqQueryRecharge, INetWorkCallback callback) {
        sendRequest(tag, reqQueryRecharge, callback);
    }

    /**
     * 校验邀请码
     *
     * @param reqVerifyInviteCode 校验邀请码请求对象
     * @param callback            请求回调
     */
    public void verifyInviteCode(String tag, ReqVerifyInviteCode reqVerifyInviteCode, INetWorkCallback callback) {
        sendRequest(tag, reqVerifyInviteCode, callback);
    }

    /**
     * 发送请求
     *
     * @param tag         请求标识
     * @param requestBody 请求对象
     * @param callback    请求回调
     */
    public void sendRequest(String tag, Object requestBody, INetWorkCallback callback) {
        sendRequest(tag, false, false, requestBody, callback);
    }

    /**
     * 发送请求
     *
     * @param tag         请求标识
     * @param cache       是否需要缓存
     * @param getCache    本次请求是否获取缓存
     * @param requestBody 请求对象
     * @param callback    请求回调
     */
    public void sendRequest(String tag, boolean cache, boolean getCache, Object requestBody, INetWorkCallback callback) {
        QCHttpRequestProxy.get().create(requestBody, new NetWorkImpl(callback))
                .tag(tag).cache(cache).getCache(getCache).build().execute();
    }

}
